<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // #### 01.画出原型链，并且在vscode上写上每一步的代码，以及对应的对象是否全等的判断

      // 1.创建一个构造函数

      function Star(uname, age, song) {
        this.uname = uname
        this.age = age
        this.song = song
      }

      // // 3.构造函数的原型
      // console.log(Star.prototype) //{constructor: ƒ}
      // // 公共方法挂在原型对象上
      Star.prototype.sing = function () {
        console.log(`我会唱${this.song}`)
      }
      // console.log(Star.prototype) //{sing: ƒ, constructor: ƒ}

      // 2.通过new实例化一个对象

      const zjl = new Star('周杰伦', 40, '你算什么男人')
      console.log(zjl)
      // 实例化身上如果没有方法，会去找原型对象身上的方法
      zjl.sing() //我会唱你算什么男人

      // 实例化对象的.__proto__===构造函数的原型
      console.log(zjl.__proto__ === Star.prototype) // true
      //  构造函数的原型对象身上有一个constructor属性指回构造函数
      console.log(Star.prototype.constructor === Star) // true
      // 4.原型对象通过.__proto__属性找到内置构造函数Objec的原型对象
      console.log(zjl.__proto__.__proto__ === Object.prototype) //true
      // 内置构造函数Object.prototype身上的constructor属性又指回Object构造函数
      console.log(Object.prototype.constructor === Object) //true
      // 5.Object的原型对象再往上找就是null
      console.log(zjl.__proto__.__proto__.__proto__) //null

      // console.log(Object.__proto__)
      console.dir(Array.__proto__ === Function.prototype) //)
    </script>
  </body>
</html>
